Python dataclasses
dataclass 是 Python 3.7 引入的一个装饰器和模块,目的是简化数据类的定义和操作。它通过自动生成初始化方法、表示方法和比较方法,为类提供结构化数据支持。
特性:
- 自动生成 __init__、__repr__和__eq__方法。
- 支持字段默认值和默认工厂函数。
- 可以通过 field()设置字段的元数据或特殊选项(如default、default_factory)。
- 支持 frozen参数,使类的实例不可变。
- 支持继承,但需要注意字段的冲突和覆盖问题。
优点:
- 代码简洁,避免手动定义重复的方法。
- 易于维护,特别是在数据结构频繁变化的场景。
- 提供类型注解,便于静态分析和工具支持。
局限性:
- 不支持动态字段定义。
- 对复杂的业务逻辑支持有限。
- 性能略低于手动实现的类。
基础用法
from dataclasses import dataclass
@dataclass
class Point:
    x: int
    y: int
    label: str = "Default Label"
p = Point(10, 20)
print(p)  # 输出:Point(x=10, y=20, label='Default Label')
以上代码为 Point 类自动生成了 __init__, __repr__ 和 __eq__ 等方法。
常用参数
- frozen: 如果设置为- True,则生成的对象是不可变的,即不能修改属性的值。
- order: 如果设置为- True,则会生成比较方法,如- __lt__、- __le__等。
- repr: 如果设置为- False,则不会生成- __repr__方法。
Field 对象
使用 dataclasses.field() 可以为特定字段设置默认值或其他特性。
@dataclasses.dataclass
class Point:
    x: int
    y: int = dataclasses.field(default=0)
使用场景
当你需要一个简单的类,主要用于存储数据,并希望自动为其生成常用的特殊方法时,dataclasses 是一个非常有用的工具。
默认值和默认工厂方法
@dataclasses.dataclass
class InventoryItem:
    name: str
    unit_price: float = 0.0
    quantity_on_hand: int = 
	    dataclasses.field(default_factory=list)
item = InventoryItem("apple")
不可变对象 (Frozen)
@dataclasses.dataclass(frozen=True)
class Point:
    x: int
    y: int
p = Point(1, 2)
# p.x = 3  # 这会引发一个错误,因为对象是不可变的
生成比较方法
@dataclasses.dataclass(order=True)
class Student:
    grade: int
    name: str
alice = Student(90, "Alice")
bob = Student(85, "Bob")
print(alice > bob)  # 输出: True
忽略某些字段的比较
@dataclasses.dataclass
class WithUnrelated:
    value: int
    transient: int = dataclasses.field(compare=False)
a = WithUnrelated(1, 100)
b = WithUnrelated(1, 200)
print(a == b)  # 输出: True,因为 `transient` 字段在比较时被忽略了
本文作者:Maeiee
本文链接:Python dataclasses
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!
